//
//  ObservableSubscribeViewController.swift
//  iOS-RxSwift-Tutorials_Example
//
//  Created by mengru.tian on 2020/9/17.
//  Copyright © 2020 CocoaPods. All rights reserved.
//

import UIKit
import RxSwift

// 2.Observable - 订阅、事件监听、订阅销毁
class ObservableSubscribeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        self.title = "Observable - 订阅、事件监听、订阅销毁"
        self.view.backgroundColor = UIColor.white
    }
    
    // MARK: - Subscribe
    
    // 我们使用 subscribe() 订阅了一个 Observable 对象，该方法的 block 的回调参数就是被发出的 event 事件，我们将其直接打印出来。
    func testSubscribe() throws {
        let observable = Observable.of("A", "B", "C")
                 
        observable.subscribe { event in
            print(event.element as Any)
        }.dispose()
    }
    
    // RxSwift 还提供了另一个 subscribe 方法，它可以把 event 进行分类
    // 通过不同的 block 回调处理不同类型的 event。（其中 onDisposed 表示订阅行为被 dispose 后的回调，这个我后面会说）
    // 同时会把 event 携带的数据直接解包出来作为参数，方便我们使用。
    func testSubscribe2() throws {
        let observable = Observable.of("A", "B", "C")
                 
        observable.subscribe(onNext: { element in
            print(element)
        }, onError: { error in
            print(error)
        }, onCompleted: {
            print("completed")
        }, onDisposed: {
            print("disposed")
        }).dispose()
    }
    
    // subscribe() 方法的 onNext、onError、onCompleted 和 onDisposed 这四个回调 block 参数都是有默认值的，即它们都是可选的。所以我们也可以只处理 onNext 而不管其他的情况。
    func testSubscribe3() throws {
        let observable = Observable.of("A", "B", "C")
                 
        observable.subscribe(onNext: { element in
            print(element)
        }).dispose()
    }
    
    // MARK: - 监听事件的生命周期
    
    //（1）我们可以使用 doOn 方法来监听事件的生命周期，它会在每一次事件发送前被调用。
    //（2）同时它和 subscribe 一样，可以通过不同的 block 回调处理不同类型的 event。比如：
    // do(onNext:) 方法就是在 subscribe(onNext:) 前调用
    // 而 do(onCompleted:) 方法则会在 subscribe(onCompleted:) 前面调用。
    func testDoOn() throws {
        let observable = Observable.of("A", "B", "C")
         
        observable.do(onNext: { element in
            print("Intercepted Next：", element)
        }, onError: { error in
            print("Intercepted Error：", error)
        }, onCompleted: {
            print("Intercepted Completed")
        }, onDispose: {
            print("Intercepted Disposed")
        })
        .subscribe(onNext: { element in
            print(element)
        }, onError: { error in
            print(error)
        }, onCompleted: {
            print("completed")
        }, onDisposed: {
            print("disposed")
        }).dispose()
    }
    
    // 除了 dispose() 方法之外，我们更经常用到的是一个叫 DisposeBag 的对象来管理多个订阅行为的销毁：
    // 我们可以把一个 DisposeBag 对象看成一个垃圾袋，把用过的订阅行为都放进去。
    // 而这个 DisposeBag 就会在自己快要 dealloc 的时候，对它里面的所有订阅行为都调用 dispose() 方法。
    func testDisposeBag() {
        let disposeBag = DisposeBag()
                 
        //第1个Observable，及其订阅
        let observable1 = Observable.of("A", "B", "C")
        observable1.subscribe { event in
            print(event)
        }.disposed(by: disposeBag)
         
        //第2个Observable，及其订阅
        let observable2 = Observable.of(1, 2, 3)
        observable2.subscribe { event in
            print(event)
        }.disposed(by: disposeBag)
    }

}
